﻿#ifndef __AF_SCENE_H__
#define __AF_SCENE_H__

#include "AF_Define.h"

namespace AF
{
	//class Graphics -* _INTERFACE ForEach
		//class Face
			//class CmdFace
				class Scene;
}
typedef AF::Scene			AF_CScene;


#include "AF_CmdFace.h"
#include "AF_Layout.h"
#include "AF_Window.h"
#include "AF_Canvas.h"
#include "AF_Struct.h"
#include "AF_Platform.h"


#define AF_ID_OK			1
#define AF_ID_CANCEL			0
#define AF_ID_YES			1
#define AF_ID_NO			0
#define AF_ID_ERROR			255

namespace AF
{
	/// 场景类
	class _ABSTRACT Scene : public CmdFace
	{
	public:
		Scene();
		virtual ~Scene();

		/**
		 *  @name 事件成员
		 */
		// 继承事件
// 	public:
// 		virtual bool		OnPreRender(Graphics* pGraphics);		// 当渲染场景之前时
// 		virtual bool		OnRender();					// 当渲染场景时
// 	protected:
// 		// 当初始化时
// 		virtual bool		OnInit(Bundle* pParam);				// 当场景初始化时
// 		virtual void		OnKeyDown(int nKeyCode);			// 当按键按下时
// 		virtual void		OnKeyUp(int nKeyCode);				// 当按键抬起时
// 		virtual void		OnPointDown(int nKeyCode, int nX, int nY);	// 当屏幕点按下时
// 		virtual void		OnPointUp(int nKeyCode, int nX, int nY)	;	// 当屏幕点抬起时
// 		virtual void		OnPointMove(int nKeyCode, int nX, int nY);	// 当屏幕点移动时

		// 定义事件
	public:
		/// 得到事件时
		virtual void		OnGetEvent(Event& event)			// 得到事件时
					{return;}
	protected:
		/// 场景开始时
		virtual	bool		OnStart()					// 场景开始时，返回是否允许开始
					{return true;}
		/// 场景更新时
		virtual void		OnUpdate()					// 场景更新时
					{return;}
		/// 场景结束时
		virtual bool		OnExit(bool bIsCommand)				// 场景结束时，返回是否允许结束
					{return true;}
		/// 场景退出时
		virtual void		OnEnd()						// 场景退出时
					{return;}
		/// 场景返回时
		virtual int		OnReturn()					// 场景返回时
					{return m_nReturn;}

		/**
		 *  @name 其他成员
		 */
	public:
		/// 键盘按下
  		virtual void		KeyboardDown(int nKeyCode)
  					{OnKeyDown(nKeyCode);}
		/// 键盘抬起
  		virtual void		KeyboardUp(int nKeyCode)
  					{OnKeyUp(nKeyCode);}
		/// 鼠标按下
  		virtual void		MouseDown(int nKeyCode, int nX, int nY)
  					{OnPointDown(nKeyCode, nX, nY);}
		/// 鼠标抬起
  		virtual void		MouseUp(int nKeyCode, int nX, int nY)
  					{OnPointUp(nKeyCode, nX, nY);}
		/// 鼠标移动
  		virtual void		MouseRightDown(int nKeyCode, int nX, int nY)
  					{OnPointMove(nKeyCode, nX, nY);}

	public:
		/// 设置布局
		void			SetLayout(Layout* pLayout);
		/// 获得布局
		Layout*			GetLayout();

		/// 设置窗口句柄
		bool			SetWindow(Window* pWindow);
		/// 获得窗口句柄
		Window*			GetWindow();

		/// 运行场景
		int			Start(Scene* pBackScene);
		/// 退出场景
		bool			Exit(bool isCommand = false);
		/// 场景结束时
		int			End();
		/// 场景是否已经退出
		bool			IsExit();
		/// 场景是否正在运行
		bool			IsStart();
		/// 获得场景返回值
		int			GetReturn();

		/// 场景是否为全窗口状态
		bool			IsFullWindow();
		/// 获得底层场景
		Scene*			GetBackScene();
		/// 获得窗口尺寸
		Size*			GetWindowSize();
		/// 获得绘制句柄
		Canvas*			GetCanvas();

	protected:
		/// 返回指定返回值
		void			Return(int nReturn);
		/// 返回“确定”
		void			ReturnOK();
		/// 返回“取消”
		void			ReturnCancel();
		/// 返回“是”
		void			ReturnYes();
		/// 返回“否”
		void			ReturnNo();
		/// 返回错误值
		void			ReturnError(int nErrorCode);

	public:
		/// 场景更新期
		void			Update();

		/// 设置场景是否为全窗口运行
		void			FullWindow(bool isFullWindow = true);

	public:
		/// 添加到画布
		void			AddToCanvas(Graphics* pGraphics);
		/// 更新画布
		void			UpdateCanvas();
		/// 重置画布
		void			ResetCanvas();

	protected:
		/// 是否为全窗口
		bool			m_isFullWindow;
		/// 底层场景
		Scene*			m_pBackScene;
		/// 返回值
		int			m_nReturn;

	private:
		bool			m_isStart;
		bool			m_isExit;

	private:
		Layout*			m_pLayout;

		Window*			m_pWindow;
		Canvas*			m_pCanvas;
		bool			m_isUpdateCanvas;

		Platform*		m_pPlatform;			// 用于卸载AF_ICanvas
	};
}

#endif